/*
 * @Author: 橘子
 * @Date: 2022-10-23 16:22:49
 * @Project_description: 批量导出zip
 * @Description: 代码是我抄的，不会也是真的
 */

import axios from 'axios'
import dayjs from 'dayjs'
import { Loading, Message } from 'element-ui'
import FileSaver from 'file-saver'
import JSZip from 'jszip'
import util from '@/libs/util'
import  setting from '@/setting'
import { compressFile } from '@/libs/util.compressFile'
/**
 * @Author: 橘子
 * @desc:
 * @param {*} url
 * @return {*}
 */
export const getFile = (url) => {
  return new Promise((resolve, reject) => {
    // 获取token
    const token = util.cookies.get('token')
    const tokenType = util.cookies.get('token_type')
    axios({
      method: 'get',
      url,
      headers:{
        'Authorization' : '' + ' ' + token
      },
      // 注意的是responseType, 如果下载文件是文本类型的(如: .txt, .js之类的),那么用responseType: 'text'也可以, 但是如果下载的文件是图片, 视频之类的, 就得用arraybuffer
      responseType: 'arraybuffer',
    })
      .then((data) => {
        resolve(data.data)
      })
      .catch((error) => {
        // console.log('发生错误了')
        reject(error.toString())
      })
  })
}

/**
 * @description 批量下载文件并且转为file
 * @author 橘子
 * @return {Promise<Array>} 无返回值
 * @param urls {Array<String>}  url数组
 */
export  const getFiles = (urls) => {
  return new Promise((resolve, reject) => {

    let promises = []
    urls.forEach((item) => {
      const promise = axios({
        method: 'get',
        url:setting.appInfo.baseUrl+ 'message/api/v1/common/downLoad/'+item,
        // 注意的是responseType, 如果下载文件是文本类型的(如: .txt, .js之类的),那么用responseType: 'text'也可以, 但是如果下载的文件是图片, 视频之类的, 就得用arraybuffer
        responseType: 'arraybuffer',
      })
        .then((data) => {
          //转成file
          let urls = item.split('/')
          let itemName = urls[urls.length - 1]
          let suffix = itemName.split('.')[1]
          return new File([data.data], `${itemName}`, {
              type: `image/${suffix}`,
            }
          )
        })
        .catch((error) => {
          console.log('发生错误了',error)
          reject(error.toString())
        })
      promises.push(promise)
    })
    Promise.all(promises).then((res) => {
      resolve(res)
    })
  })
}

/**
 * @desc:  生成zip
 * @param {*} data url数组
 * @param {*} name 生成的压缩包文件名称
 * @return {*}
 * @Author: 橘子
 */
const zip = async (data, name) => {
  const loading = Loading.service({
    text: '正在下载...',
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.7)',
  })
  try {
    let content = await createBlob(data)
    // 生成二进制流
      FileSaver.saveAs(content, `${name}-${dayjs().format('YYYY-MM-DD')}.zip`) // 利用file-saver保存文件
    loading.close()
  } catch (error) {
    loading.close()
    Message.error('下载失败')
  }
}


//创建二进制流文件
export const createBlob = (data,cb) => {

  return new  Promise(async (resolve, reject) => {
    const zip = new JSZip()
    const cache = {}
    const promises = []
    await data.forEach((item, index) => {
      const promise = getFile(item).then((data) => {
        // 获取下载文件名称
        let urls = item.split('/')
        let itemName = index + '-' + urls[urls.length - 1]
        //获取文件后缀
        let suffix = itemName.split('.')[1]
        // 如果有回调函数，就执行回调函数
        if(cb){
          itemName=cb(itemName)
        }
        zip.file(`${index}实例图片.${suffix}`, data, {
          binary: true,
        }) // 逐个添加文件
        cache[item] = data
      }).catch((error) => {
        reject(error)
        Message.error('下载失败')
      })
      promises.push(promise)
    })
    Promise.all(promises).then(() => {
      zip
        .generateAsync({
          type: 'blob',
        })
        .then((content) => {
          resolve(content)
        })
        .catch((err) => {
          reject(err)
          Message.error('下载失败')
        })
    })
  })
}


/**
 * @description 方法名
 * @Date 2023-07-28 09:33:08
 * @author 橘子
 * @return {Promise<blob>} 返回blob
 * @param data {Array<File>}  文件数组
 */
export  const compressedIntoZip = (data) => {
  const zip = new JSZip()
 return new  Promise(async (resolve, reject) => {
    data.forEach((item, index) => {
      zip.file(item.name, item, {
        binary: true,
      }) // 逐个添加文件
    })
   zip.generateAsync({
       type: 'blob',
     })
     .then((content) => {
       resolve(content)
     })
     .catch((err) => {
       reject(err)
     })
 })
}

/**
 * @description blob转base64
 * @Date 2023-09-27 15:27:20
 * @author 橘子
 * @return {Promise} 无返回值
 * @param blob
 */
export  const blobTobase64 = (blob) => {
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.readAsDataURL(blob) // 转换为base64，可以直接放入a表情href
    reader.onload = (e) => {
      resolve(e.target.result)
    }
  })
}

/**
 * @description base64转File,并且赋值名称
 * @Date 2023-09-27 15:27:33
 * @author 橘子
 * @return {Promise} 文件流
 * @param base64 文件流
 * @param name 文件名称
 */
export  const base64ToFile = (base64,name=dayjs().format('YYYY-MM-DD')) => {
  return new Promise(async(resolve, reject) => {
    let arr = base64.split(',')
    let mime = arr[0].match(/:(.*?);/)[1]
    let suffix = mime.split('/')[1] // 图片后缀
    let bstr = atob(arr[1])
    let n = bstr.length
    let u8arr = new Uint8Array(n)
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n)
    }
    // 转换成file对象
    let file = new File([u8arr], `${name}.${suffix}`, {
      type: mime,
    })
    resolve(file)
  })
}


/**
 * @description 下载文件
 * @author 橘子
 * @return {void} 无返回值
 * @param File
 */
export  const downloadFile = (File) => {
  FileSaver.saveAs(File)
}

export  const fileListToZip = (fileList,name) => {
  const zip = new JSZip()
  fileList.forEach((item, index) => {
    zip.file(item.name, item, {
      binary: true,
    }) // 逐个添加文件
  })
  zip.generateAsync({
    type: 'blob',
  }).then((content) => {
    downloadFile(content)
  })
}
export default zip
